/**
 * 统一存储工具类
 * 优化token管理，提升安全性
 */

interface StorageOptions {
  expire?: number; // 过期时间（毫秒）
}

class StorageUtil {
  /**
   * 设置存储项（支持过期时间）
   */
  setItem(key: string, value: any, options?: StorageOptions): void {
    const item = {
      value,
      timestamp: Date.now(),
      expire: options?.expire,
    };

    try {
      localStorage.setItem(key, JSON.stringify(item));
    } catch (error) {
      console.warn("LocalStorage设置失败:", error);
    }
  }

  /**
   * 获取存储项（自动检查过期）
   */
  getItem(key: string): any {
    try {
      const itemStr = localStorage.getItem(key);
      if (!itemStr) return null;

      const item = JSON.parse(itemStr);

      // 检查是否过期
      if (item.expire && Date.now() - item.timestamp > item.expire) {
        this.removeItem(key);
        return null;
      }

      return item.value;
    } catch (error) {
      console.warn("LocalStorage获取失败:", error);
      return null;
    }
  }

  /**
   * 删除存储项
   */
  removeItem(key: string): void {
    try {
      localStorage.removeItem(key);
    } catch (error) {
      console.warn("LocalStorage删除失败:", error);
    }
  }

  /**
   * 清空所有存储
   */
  clear(): void {
    try {
      localStorage.clear();
    } catch (error) {
      console.warn("LocalStorage清空失败:", error);
    }
  }

  /**
   * 检查存储项是否存在且未过期
   */
  hasItem(key: string): boolean {
    return this.getItem(key) !== null;
  }
}

// Token管理类
class TokenManager {
  private readonly TOKEN_KEY = "auth_token";
  private readonly USER_INFO_KEY = "user_info";
  private readonly TOKEN_EXPIRE = 7 * 24 * 60 * 60 * 1000; // 7天

  /**
   * 设置Token（同时设置到localStorage，Cookie由后端管理）
   */
  setToken(token: string): void {
    storage.setItem(this.TOKEN_KEY, token, { expire: this.TOKEN_EXPIRE });
  }

  /**
   * 获取Token
   */
  getToken(): string | null {
    return storage.getItem(this.TOKEN_KEY);
  }

  /**
   * 删除Token
   */
  removeToken(): void {
    storage.removeItem(this.TOKEN_KEY);
    storage.removeItem(this.USER_INFO_KEY);
  }

  /**
   * 检查Token是否存在
   */
  hasToken(): boolean {
    return storage.hasItem(this.TOKEN_KEY);
  }

  /**
   * 设置用户信息
   */
  setUserInfo(userInfo: any): void {
    storage.setItem(this.USER_INFO_KEY, userInfo, {
      expire: this.TOKEN_EXPIRE,
    });
  }

  /**
   * 获取用户信息
   */
  getUserInfo(): any {
    return storage.getItem(this.USER_INFO_KEY);
  }

  /**
   * 检查登录状态
   */
  isLoggedIn(): boolean {
    return this.hasToken() && this.getUserInfo() !== null;
  }

  /**
   * 清空所有认证信息
   */
  clearAuth(): void {
    this.removeToken();
  }
}

// 导出实例
export const storage = new StorageUtil();
export const tokenManager = new TokenManager();

// 默认导出
export default {
  storage,
  tokenManager,
};
